﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using DataAccessLayer;
using DTO;
using System.Configuration;

namespace DAL
{
    public class NhanVienDAL
    {
        private DBManager _dbmanager;

        #region Phương thức khởi tạo mặc định
        /// <summary>
        /// Phương thức khởi tạo mặc định
        /// </summary>
        public NhanVienDAL()
        {
            string _connectionInfo = ConfigurationManager.AppSettings["ConnectionInfo"];
            _dbmanager = new DBManager(DataProvider.SqlServer, _connectionInfo);
        }
        #endregion

        #region Phương thức tạo 1 nhân viên từ Data Reader
        /// <summary>
        /// Phương thức tạo 1 nhân viên từ Data Reader
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private NhanVienDTO CreateNhanVienFromReader(IDataReader reader)
        {
            NhanVienDTO _nvDTO = new NhanVienDTO();
            _nvDTO.MaNhanVien = reader["MaNhanVien"].ToString();
            _nvDTO.TenNhanVien = reader["TenNhanVien"].ToString();
            _nvDTO.Email = reader["Email"].ToString();
            _nvDTO.ChucVu = reader["ChucVu"].ToString();
            _nvDTO.Quyen = Convert.ToInt32(reader["Quyen"]);
            _nvDTO.Token = Convert.ToString(reader["Token"]); 
            // Qui định : 0: Khách hàng 1: Nhân viên thường, 2: nhân viên là Admin, 3: ban giám đốc
            _nvDTO.TinhTrang = Convert.ToInt32(reader["TinhTrang"]); // Qui định : 1: đã kích hoạt, 0: chưa kích hoạt
            return _nvDTO;
        }
        #endregion

        #region Phương thức lấy toàn bộ danh sách nhân viên
        /// <summary>
        /// Phương thức lấy toàn bộ danh sách nhân viên
        /// </summary>
        /// <returns></returns>
        public List<NhanVienDTO> GetListNhanVien()
        {

            List<NhanVienDTO> _lst = new List<NhanVienDTO>();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getListNhanVien");
                while (_reader.Read())
                    _lst.Add(this.CreateNhanVienFromReader(_reader));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                    _reader.Close();
            }
            return _lst;
            
        }
        #endregion

        #region Phương thức lấy thông tin 1 nhân viên dựa vào mã nhân viên
        /// <summary>
        /// Phương thức lấy thông tin 1 nhân viên dựa vào mã nhân viên
        /// </summary>
        /// <param name="malbv"></param>
        /// <returns></returns>
        public NhanVienDTO GetNhanVien(string manv)
        {

            NhanVienDTO _nvDTO = new NhanVienDTO();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@ma_nv", manv);
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getNhanVien");
                while (_reader.Read())
                    _nvDTO = this.CreateNhanVienFromReader(_reader);                

            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                {
                    _dbmanager.Close();
                    _reader.Close();
                }
            }
            return _nvDTO;
            
        }
        #endregion

        #region Phương thức GetNhanVienTheoEmail
        /// <summary>
        /// Phương thức GetNhanVienTheoEmail
        /// </summary>
        /// <param name="email">string</param>
        /// <returns>NhanVienDTO</returns>
        public NhanVienDTO GetNhanVienTheoEmail(string email)
        {
            NhanVienDTO _nvDTO = new NhanVienDTO();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@email", email);
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getNhanVienTheoEmail");
                while (_reader.Read())
                    _nvDTO = this.CreateNhanVienFromReader(_reader);

            }
            catch (Exception ex)
            {

                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                {
                    _reader.Close();
                    _dbmanager.Close();
                }
            }

            return _nvDTO;
        }
        #endregion

        #region Comment
        ///// <summary>
        ///// Phương thức Đăng nhập cho nhân viên
        ///// </summary>
        ///// <param name="tendangnhap">string</param>
        ///// <param name="matkhau">string</param>
        ///// <returns></returns>
        //public NhanVienDTO getNhanVien(string tendangnhap, string matkhau)
        //{
        //    NhanVienDTO nv = new NhanVienDTO();
        //    IDataReader reader = null;
        //    try
        //    {
        //        _dbmanager.Open();
        //        _dbmanager.CreateParameters(2);
        //        _dbmanager.AddParameters(0, "@ten_dn", tendangnhap);
        //        _dbmanager.AddParameters(1, "@matkhau", matkhau);
        //        reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getDangNhapNhanVien");
        //        while (reader.Read())
        //            nv = createNhanVienFromReader(reader);
        //    }
        //    catch (Exception ex)
        //    {
        //        throw new Exception(ex.Message);
        //    }
        //    finally
        //    {
        //        if (reader != null)
        //            reader.Close();
        //    }
        //    return nv;

        //}

        ///// <summary>
        ///// Phương thức kiểm tra nhập mật khẩu cũ có đúng ko?
        ///// </summary>
        ///// <param name="nv"></param>
        ///// <returns></returns>
        //public string ktNhapMatKhauCu(NhanVienDTO nv)
        //{
        //    string index = null;
        //    try
        //    {
        //        // Mở kết nối
        //        _dbmanager.Open();

        //        // Thực thi câu truy vấn
        //        _dbmanager.CreateParameters(1);
        //        _dbmanager.AddParameters(0, "@ma_nv", nv.MaNhanVien);
        //        index = _dbmanager.ExecuteScalar(CommandType.StoredProcedure, "usp_ktNhapMatKhauCu").ToString();
        //    }
        //    catch (Exception ex)
        //    {
        //        throw new Exception(ex.Message);
        //    }
        //    finally
        //    {
        //        if (_dbmanager.Connection.State == ConnectionState.Open)
        //            _dbmanager.Close();
        //    }
        //    return index;

        //}
        #endregion

        #region Phương thức thêm 1 nhân viên
        /// <summary>
        /// Phương thức thêm 1 nhân viên
        /// </summary>
        /// <param name="nv"></param>
        /// <returns></returns>
        public int Them(NhanVienDTO nvDTO)
        {
            
            int _index = -1;
            try
            {                
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn                
                _dbmanager.CreateParameters(7);
                _dbmanager.AddParameters(0, "@ma_nv", nvDTO.MaNhanVien);
                _dbmanager.AddParameters(1, "@ten_nv", nvDTO.TenNhanVien);
                _dbmanager.AddParameters(2, "@email", nvDTO.Email);
                _dbmanager.AddParameters(3, "@chucvu", nvDTO.ChucVu);
                _dbmanager.AddParameters(4, "@quyen", nvDTO.Quyen);
                _dbmanager.AddParameters(5, "@token", nvDTO.Token);
                _dbmanager.AddParameters(6, "@tinhtrang", nvDTO.TinhTrang);
                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_ThemNhanVien");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return _index;
            
        }
        #endregion

        #region Phương thức sửa thông tin 1 nhân viên
        /// <summary>
        /// Phương thức sửa thông tin 1 nhân viên
        /// </summary>
        /// <param name="nv"></param>
        /// <returns></returns>
        public int Sua(NhanVienDTO nvDTO)
        {
            
            int _index = -1;
            try
            {
                // Mở kết nối
                _dbmanager.Open();

                _dbmanager.CreateParameters(7);
                _dbmanager.AddParameters(0, "@ma_nv", nvDTO.MaNhanVien);
                _dbmanager.AddParameters(1, "@ten_nv", nvDTO.TenNhanVien);
                _dbmanager.AddParameters(2, "@email", nvDTO.Email);
                _dbmanager.AddParameters(3, "@chucvu", nvDTO.ChucVu);
                _dbmanager.AddParameters(4, "@quyen", nvDTO.Quyen);
                _dbmanager.AddParameters(5, "@token", nvDTO.Token);
                _dbmanager.AddParameters(6, "@tinhtrang", nvDTO.TinhTrang);

                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_CapNhatNhanVien");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return _index;
            
        }
        #endregion

        #region Phương thức xóa 1 nhân viên
        /// <summary>
        /// Phương thức xóa 1 nhân viên
        /// </summary>
        /// <param name="lbv"></param>
        /// <returns></returns>
        public int Xoa(NhanVienDTO nvDTO)
        {
            int _index = -1;
            try
            {
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@ma_nv", nvDTO.MaNhanVien);
                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_XoaNhanVien");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }
            return _index;

        }
        #endregion

    }
}